home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
cpp_libs
/
answrbok
/
6_10.lha
/
6_10
/
6_10mul.c
< prev
next >
Wrap
Text File
|
1993-08-08
|
2KB
|
124 lines
* Copyright (c) 1990 by AT&T Bell Telephone Laboratories, Incorporated. */
* The C++ Answer Book */
* Tony Hansen */
* All rights reserved. */
*
Multiply u[1..n] * v[1..m] to form w[0..m+n]
Based on:
The Art of Computer Programming, volume 2
D. Knuth, Section 4.3.1, Algorithm M
modified to ignore w[0..m]
/
include <lint.h>
INT operator*(LINT u, LINT v)
int negans = 0;
/*
Make u positive
*/
if (u.isneg())
{
negans = 1;
u = -u;
}
/*
Make v positive
*/
if (v.isneg())
{
negans = 1 - negans;
v = -v;
}
/*
M1(a) [Initialize]
Set w[m+1..m+n] <- 0
{ modified: set w[0..n] <- 0 }
*/
LINT w = 0;
/*
M1(b) [Initialize]
Set j <- m
M6 [Loop on j]
decrease j by one
if j > 0, goto M2
*/
for (int j = 3; j >= 0; j--)
{
/*
M2 [zero multiplier?]
if v[j] == 0
w[j] <- 0
goto M6
{ modified: skip w[j] since 0<=j<m }
*/
if (v.s[j] == 0)
;
// w.s[j] = 0;
else
{
/*
M3 [Initialize i]
set i <- n,
k <- 0
M5(a) [Loop on i]
decrease i by one
if i > 0, goto M4
{ modified: loop on i+j > 0, i+j<n }
*/
LINT_Ltype v_j = v.s[j];
for (int i = 3, k = 0, iplusj = i + j - 3;
iplusj >= 0;
i--, iplusj--)
{
/*
M4 [multiply and add]
Set t <- u[i] * v[j] + w[i+j] + k
w[i+j] <- t % b
k <- t / b
{ modified: i+j tracks i }
*/
LINT_Ltype t = u.s[i] * v_j +
w.s[iplusj] + k;
w.s[iplusj] = t; // % LINT_base
k = t / LINT_base;
}
/*
M5(b) [Loop on i]
if i <= 0,
set w[j] <- k
{ modified: skip setting w[j],
since j<m }
*/
// w.s[j] = k;
}
}
/*
set prod <- w[m+1..m+n]
{ modified: set prod <- w[1..n] }
*/
LINT prod;
for (int i = 0; i < 4; i++)
prod.s[i] = w.s[i];
/*
restore sign
*/
if (negans)
return -prod;
else
return prod;